package arraylist;

import jdk.swing.interop.SwingInterOpUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MyArrayList {
    //通过这个数组，来表示顺序表中的元素
    private String[] data=null;
    //表示有效个数
    private int size = 0;

    public MyArrayList() {
            data = new String[10];
    }
    public MyArrayList(int capacity) {
        if(capacity<=10){
            capacity=10;
        }
        data= new String[capacity];
    }
//得到字符串中子串
    public MyArrayList sublist(int start,int end) {
        if (start < 0 || end > size || start > end) {
            throw new IndexOutOfBoundsException("参数无效");
        }
        MyArrayList sublist = new MyArrayList();
        for (int i = 0; i < size; i++) {
            for (int j = start; j < end; j++) {
                if (i == j) {
                    //遍历如果找到了相同的元素，就添加到sublist中
                    sublist.add(data[i]);
                }
            }
        }
        return sublist;
    }
    //查找数组中的第一个元素的下标最后一个元素下标
    public int lastIndex(String elem){
        for(int i =size-1;i>=0;i--){
            //从右往左遍历数组，找到第一个元素的下标
            if(data[i].equals(elem)){
                return i;
            }
        }
        return -1;
    }


    //查找元素在数组中的位置
    public int IndexOf(String  elem){
        for(int i=0;i<size;i++){
            //从左往右遍历数组，找到第一个元素的下标
            if(data[i].equals(elem)){
                return i;
            }
        }
            return -1;
    }

    //查找元素在数组中是否存在
    public Boolean contains(String elem){
        for(int i=0;i<size;i++){
            //遍历数组，相等就返回true
            if(data[i].equals(elem)){
                return true;
            }
        }
        return false;
    }
    //clear方法，清空顺序表
    public void clear(){
        size=0;
    }
//删除元素
    //返回被删除元素的值
    public void remove(int index){
        if(index<0||index>size){
            throw new IndexOutOfBoundsException("Index out of bounds");
        }
       String elem=data[index];
        //从index开始，把后面的元素向前移动
        for(int i=index;i<size-1;i++){
            data[i]=data[i+1];
        }
        size--;
    }
    //按照元素值来删除
    public Boolean remove(String elem){
        int removePos=0;
         for(;removePos<size;removePos++){
             if(data[removePos].equals(elem)){
                 //这个i就是要删除的元素的位置
                 break;
             }
         }
         //没找到要删除的元素
         if(removePos==size){
             return false;
         }
         //从removePos开始，把后面的元素向前移动
        for(int i=removePos;i<size-1;i++){
            data[i]=data[i+1];
        }
        size--;
        return true;
    }

    public String get(int index) {
        //需要判断下标
        if (index < 0 || index >= size){
            throw new IndexOutOfBoundsException("Index out of bounds");
        }
        return data[index];
    }
    public void set(String elem,int index){
        if(index<0||index>=size){
            throw new IndexOutOfBoundsException("Index out of bounds");
        }
        data[index]=elem;
    }

    //实现尾插
    public void add (String elem){
        //当我们发现空间不够的时候，我们需要扩容
        if(size>=data.length){
            //扩容
            resize();
        }
        //把尾部元素移动到数组的最后一个位置
        data[size]=elem;
        size++;
    }
    //往中间位置插入，
    public void add(int index,String elem){
        if(index <0||index>size){
            throw new IndexOutOfBoundsException("参数无效");
        }
        if(size>=data.length){
            //扩容
            resize();
        }
//把inde位置后面的元素向后移动
        //如果从index开始移动，index就会覆盖index+1的位置元素，所以要从size-1开始移动
        for(int i=size-1;i>=index;i--){
            data[i+1]=data[i];
        }
        //如何把插入的元素放到index位置
        data[index]=elem;
        size++;
    }

    public void resize(){
        //扩容
        //1.创建更长的数组，新的数组是之前的1.5倍。
        String[] newDate=new String[(int)(data.length*1.5)];
        //2.旧数组的元素赋值到新数组，
        for(int i=0;i<size;i++){
            newDate[i]=data[i];
        }
        // 3.使用新数组代替旧数组
        data = newDate;
    }

    @Override
    public String toString() {
        // 创建一个 StringBuilder 对象，用于高效地构建字符串
        StringBuilder stringBuilder = new StringBuilder();
        // 在字符串的开头添加一个 '[' 字符，表示顺序表的开始
        stringBuilder.append("[");
        // 遍历顺序表中的有效元素（根据 size 确定）
        for (int i = 0; i < size; i++) {
            // 将每个有效元素添加到 StringBuilder 中
            stringBuilder.append(data[i]);
            // 如果当前元素不是最后一个元素，则添加一个 ',' 字符，以分隔元素
            if (i < size - 1) {
                stringBuilder.append(",");
            }
        }
        // 在字符串的末尾添加一个 ']' 字符，表示顺序表的结束
        stringBuilder.append("]");

        // 将构建好的字符串转换为 String 对象并返回
        return stringBuilder.toString();
    }
    public static void test1(){//contians方法测试
        //判断元素是否存在
        MyArrayList list=new MyArrayList();
        list.add("hello");
        list.add("world");
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        System.out.println(list.contains("hello"));
    }
public static void test2() {//add方法测试
//增加元素
    MyArrayList list=new MyArrayList();
     list.add("hello");
     list.add("world");
     list.add("1");
     list.add("2");
     list.add("3");
     list.add("4");
     list.add(1,"java");
     System.out.println(list.toString());//在1位置插入java
    }
    public static void test3(){//remove方法测试
        MyArrayList list=new MyArrayList();
        list.add("hello");
        list.add("world");
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        //删除元素
        list.remove(1);//删除下标为1的元素
        System.out.println(list.toString());//打印验证

        System.out.println(list.remove("1"));//删除值为1的元素
        //false

    }
    public static void test4(){//clear方法测试
        MyArrayList list=new MyArrayList();
        list.add("hello");
        list.add("world");
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        //清空数组测试
        list.clear();
        System.out.println(list.toString());
    }
    public static void test5(){
        MyArrayList list=new MyArrayList();
        list.add("hello");
        list.add("world");
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        //中间插入测试
        list.add(2,"java");
        System.out.println(list.toString());
    }
    public static void test6(){//查找第一个元素位置测试
        MyArrayList list=new MyArrayList();
        list.add("hello");
        list.add("world");
        list.add("1");
        list.add("2");
        list.add("3");
        System.out.println(list.IndexOf("2"));
    }
    public static void test7(){//返回最有一个元素位置测试
        MyArrayList list=new MyArrayList();
        list.add("hello");
        list.add("world");
        list.add("1");
        list.add("2");
        list.add("3");
        System.out.println(list.lastIndex("3"));

    }
    public static void test8(){//在字符串中查找子串测试
        MyArrayList list=new MyArrayList();
        list.add("hello");
        list.add("world");
        list.add("1");
        list.add("2");
        list.add("3");
        System.out.println(list.sublist(1,3));

    }
    public static void main(String[] args) {
        test1();//contains方法测试
        test2();//add方法测试

        test3();//remove方法测试
        test4();//clear方法测试

        test5();//中间插入测试
        test6();//查找元素位置测试

        test7();//查找最后一个元素位置测试
        test8();//查找子串测试

    }
}
